package com.g01.qt;

/**
 * 一个节点的定义，单链表的节点
 */
public class Node {
    private int data;  // 数据域
    private Node next;  // 指针，默认就是 null

    public Node(int data) {
        this.data = data;
    }

    public Node(int data, Node next) {
        this.data = data;
        this.next = next;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "本节点的值为: " + getData();
    }

    public static Node createLinkNode(int[] nums) {  // 根据数组创建链表
        if (nums.length < 1) {
            return null;
        }
        Node head = new Node(nums[0]);
        Node temp = head;
        for (int i = 1; i < nums.length; i++) {
            temp.setNext(new Node(nums[i]));
            temp = temp.getNext();
        }
        return head;
    }

    // 以下是一些具体的操作

    static void show(Node head) {
        // 打印链表元素
        Node temp = head.getNext();
        while (temp != null) {
            System.out.printf("%d->", temp.getData());
            temp = temp.getNext();
        }
        System.out.println();  // 最后打印一个换行符
    }

    static int getLength(Node head) {
        // 返回链表长度
        int l = 0;
        Node temp = head.getNext();
        while (temp != null) {
            l += 1;
            temp = temp.getNext();
        }
        return l;
    }

    static void headAdd(Node head, int data) {
        // 头插法
        Node temp = new Node(data);
        temp.setNext(head.getNext());
        head.setNext(temp);
    }

    static void endAdd(Node head, int data) {
        // 尾插法
        Node temp = head;
        while (temp.getNext() != null) {  // 找到尾巴
            temp = temp.getNext();
        }
        temp.setNext(new Node(data));  // 插入节点
    }

    static void centerAdd(Node head, int data, int position) {
        // 中间指定位置插入，position就是插入的位置
        if (position < 1 || position > getLength(head) + 1) {
            System.out.println("插入位置不合法");
            return;
        }

        Node temp = head;
        Node node = new Node(data);
        for (int i = 0; i < position - 1; i++) {  // 找到插入位置的前一个元素
            temp = temp.getNext();
        }
        node.setNext(temp.getNext());
        temp.setNext(node);
    }

    static void delete(Node head, int position) {
        // 删除指定位置的节点
        if (position < 1 || position > getLength(head)) {
            System.out.println("删除位置不合法");
            return;
        }

        Node temp = head;
        for (int i = 0; i < position - 1; i++) {  // 找到删除位置的前一个元素
            temp = temp.getNext();
        }
        temp.setNext(temp.getNext().getNext());  // 删除节点
    }
}
